package week3;
import java.io.*;
import java.util.*;
public class 区间合并_1343_挤牛奶 {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		Integer arr[][] = new Integer[n][2];
		StringTokenizer st;
		for(int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr, new Comparator() {
			@Override
			public int compare(Object o1, Object o2) {
				Integer a1[] = (Integer[]) o1;
				Integer a2[] = (Integer[]) o2;
				return a1[0].compareTo(a2[0]);
			}
		});
		
		
		int max = 0;
		int noPeople = 0;
		
		int l = arr[0][0];
		int r = arr[0][1];
		
		for(int i = 1; i < n; i++) {
			// 当前区间的开始时间在前一个区间的结束时间内，则把当前区间设置为两个区间合并
			if(arr[i][0] <= r) {
				// 合并区间 
				r = Math.max(r, arr[i][1]);
			} else {
				// 当前区间与前一个区间合并不了 则统计数据 lr更新为当前区间（因为当前区间合并不了前一个 所以作为新区间
				max = Math.max(max, r - l);
				noPeople = Math.max(noPeople, arr[i][0] - r);
				l = arr[i][0];
				r = arr[i][1];
			}

		}
		// 最后合并的区间没有进行计算，循环结束后要进行计算
		max = Math.max(max, r-l);
		System.out.println(max + " " + noPeople);
	}
}
